//=========================================================
// Построение системы квантовых состояний
// для заданной топологии воздушных трасс
//---------------------------------------------------------
// Проведение имитационного эксперимента
//=========================================================
// 1. все топологии воздушных трасс должны быть в maps/
// 2. построенные сплайны в splines/<topology>/
//    gnuplot plot_<topology>.gnu - построение графика
// 3. построенные системы квантовых состояний в 
//    logs/mine-fields_<topology>
// 4. 
//=========================================================
#include <stdio.h>
#include "air.hpp"
//=========================================================
int main(int argc, char **argv){
  if(argc<2){
    printf("Error: try ./mine_field <topology_file>\n");
    return 1;
  }
  //-------------------------------------------------------
  bool flag_R = false;

  char *topology;
  argv[1] = strtok(argv[1],"/");
  while(argv[1] != NULL){
    topology = argv[1];
    argv[1] = strtok(NULL,"/");
  }
  printf("TOPOLOGY: %s\n",topology);

  air *air_space;
  FILE *fd;
  
  air_space = new air(topology);
  if(air_space->get_name() != NULL){
    char logpath[100];
    snprintf(logpath,sizeof(logpath),"splines/%s",topology);
    int pid = fork();
    if(pid == 0){
      int res = execl("/bin/mkdir","mkdir",logpath,NULL);
      if(res != -1)
        printf("create directory: %s\n",logpath);
      else
        perror("Error: creating directory\n");
    }else{
      printf("===BUILDING_R:\n");
      snprintf(logpath,sizeof(logpath),"logs/mine-fields_%s",topology);
      fd = fopen(logpath,"w+");
      if(fd == NULL){
        perror("Error: opening log file source");
      }else{
        air_space->set_min_r(5);
        air_space->set_tau(60); // задаем Tau

        air_space->print(fd);
        air_space->print(stdout);

        air_space->interpolation();
        air_space->count_quant_states();

        printf("MAX кол-во квантовых состояний = %d\n",air_space->get_max_quant_state());
        air_space->set_linked_qstate(stdout);
        air_space->generate_mine_field();

        air_space->print_mine_field(fd,air_space->get_mine_field(),air_space->get_max_quant_state());
        air_space->print_mine_field(stdout,air_space->get_mine_field(),air_space->get_max_quant_state());

        air_space->get_max_heights();
        air_space->ks_in_matrix();

        air_space->trunc_mine_field(2);

        air_space->make_a_view();

        air_space->print_gnuplot();

        flag_R = true;

        fclose(fd);
      }
    }
  }
  //air_space->print_mine_field(stdout,air_space->get_mine_field(),air_space->get_max_quant_state());
  flag_R = false;
  if(flag_R){
    printf("===IMITATION:\n");
    srand(time(NULL));

    // air_space->get_distr("distr_66.txt");
    // air_space->get_distr("distr_246.txt"); // пока что обе закомментированы, т.к. для построения графика придется использовать "динамические файлы

    // air_space->get_airline_distr("source_airlines_66.txt");
    air_space->get_airline_distr("source_airlines_246.txt");

    // играемся с дисперсией
    double Dx = 0;
    int step = 14;
    for (int i = 0; i < step; ++i){
      Dx += air_space->get_dispersion(10);  
    }
    Dx = Dx/step;
    double SKO = sqrt(Dx);
    printf("\n\nDx = %g, SKO = %g\n\n",Dx,SKO );

    FILE *res;
    int period = 24*60*step;
    res = fopen("result.txt","a+");
    fprintf(res, "period = %d\n",period );
    double a = 0;
    air_space->imitation(res,24*60*step,0.5);
    // while(a <= 1){
    //   air_space->imitation(res,period,a);
    //   a += 0.1;
    // }
    // air_space->print_distr();
    fprintf(res, "\n\n");
    fclose(res);
  }
  return 0; 
}